#	最小分散集合上の２つのポートフォリオを計算
#	『金融工学入門 6.6 マーコビッツモデル』, p199　にあるラグランジュ乗数を使用した方法で計算
#	@param	earning_rate_means			資産の収益率の平均ベクトル
#	@param	earning_rate_covariances	資産の収益率の共分散ベクトル
#	@param	is_normalize					投資比率を正規化するかのフラグ
#	@return ２つの投資比率ベクトルを格納したリスト　$ratio1, $ratio2, $error_message
calc_two_min_variance_portfolios <- function( earning_rate_means, earning_rate_covariances, is_normalize = TRUE )
{
	data_count <- length( earning_rate_means )
	
	if ( data_count != nrow( earning_rate_covariances ) ||
		 data_count != ncol( earning_rate_covariances ) )
	{
		return( list( ratio1 = NULL, ratio2 = NULL, error_message = "invalide data count" ) ) 
	}

	#	λ＝0, μ=1 の時の投資比率を計算
	value_vector <- matrix( rep( 1, data_count ) )
	investment_ratio1 = solve( earning_rate_covariances, value_vector )
	if ( is_normalize == TRUE ) {
		investment_ratio1 <- investment_ratio1 / sum( investment_ratio1 )
	}

	#	λ＝1, μ=0 の時の投資比率を計算
	value_vector <- matrix( earning_rate_means )
	investment_ratio2 <- solve( earning_rate_covariances, value_vector )
	if ( is_normalize == TRUE ) {
		investment_ratio2 <- investment_ratio2 / sum( investment_ratio2 )
	}

	return( list( ratio1 = investment_ratio1, ratio2 = investment_ratio2, error_message = NULL ) ) 
}

#	最小分散点上のポートフォリオを求める
#	@param	earning_rate_means			資産の収益率の平均ベクトル
#	@param	earning_rate_covariances	資産の収益率の共分散ベクトル
#	@param	is_normalize					投資比率を正規化するかのフラグ
#	@return ２つの投資比率ベクトルを格納したリスト　$ratio, $error_message
calc_min_variance_point_portfolio <- function( earning_rate_means, earning_rate_covariances, is_normalize = TRUE )
{
	data_count <- length( earning_rate_means )
	
	if ( data_count != nrow( earning_rate_covariances ) ||
		 data_count != ncol( earning_rate_covariances ) )
	{
		return( list( ratio = NULL, error_message = "invalide data count" ) ) 
	}

	#	λ＝0, μ=1 の時の投資比率を計算
	value_vector <- matrix( rep( 1, data_count ) )
	investment_ratio = solve( earning_rate_covariances, value_vector )
	if ( is_normalize == TRUE ) {
		investment_ratio <- investment_ratio / sum( investment_ratio )
	}
	return( list( ratio = investment_ratio, error_message = NULL ) )
}